
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QImage>
#include <QPixmap>
#include <QFileDialog>
#include <QMessageBox>
#include <QWheelEvent> // 添加鼠标滚轮事件处理所需的头文件
#include <QScrollBar>



MainWindow::MainWindow(QWidget* parent,QString file_path)
	: QMainWindow(parent)
	, ui(new Ui::MainWindow)
{


    ui->setupUi(this);

    // 安装事件过滤器
    ui->label->installEventFilter(this);
    ui->label->setAcceptDrops(true);

    // 设置鼠标追踪，确保 label 接收到鼠标滚轮事件
    ui->label->setMouseTracking(true);

    // 设置全局对象
    current_pic_path = file_path;

    // 显示图片
    show_pic();

    // 自适应图片大小
    on_pushButton4_clicked();
}

MainWindow::~MainWindow()
{
	delete ui;
}

void MainWindow::dragImage(const QPoint &pos)
{
    if (!isDragging)
        return;

    // 计算偏移量并移动图片位置
    int deltaX = pos.x() - lastPos.x();
    int deltaY = pos.y() - lastPos.y();
    ui->label->move(ui->label->x() + deltaX, ui->label->y() + deltaY);
    lastPos = pos; // 更新鼠标位置


}

//void MainWindow::dragImage(const QPoint &pos)
//{
//    if (!isDragging)
//        return;

//    // 计算鼠标移动的偏移量
//    int deltaX = pos.x() - lastPos.x();
//    int deltaY = pos.y() - lastPos.y();

//    // 获取滚动区域的当前滚动位置
//    int scrollX = ui->scrollArea->horizontalScrollBar()->value();
//    int scrollY = ui->scrollArea->verticalScrollBar()->value();

//    // 根据偏移量计算新的滚动位置
//    int newScrollX = scrollX - deltaX;
//    int newScrollY = scrollY - deltaY;

//    // 设置滚动区域的新滚动位置
//    ui->scrollArea->horizontalScrollBar()->setValue(newScrollX);
//    ui->scrollArea->verticalScrollBar()->setValue(newScrollY);

//    lastPos = pos; // 更新鼠标位置
//}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{

    // 鼠标滚轮，鼠标（按下，移动，释放）事件
    if (obj == ui->label)
    {
        // 如果事件类型是鼠标滚轮事件
        QWheelEvent *wheelEvent = dynamic_cast<QWheelEvent*>(event);
        if (wheelEvent) {
            if (wheelEvent->angleDelta().y() > 0) {
                // 鼠标向上滚动，执行放大操作
                on_pushButton1_clicked(); // 调用放大按钮的点击事件处理函数
            } else {
                // 鼠标向下滚动，执行缩小操作
                on_pushButton2_clicked(); // 调用缩小按钮的点击事件处理函数
            }
            return true; // 表示事件已经处理，不需要进一步传递
        }

        // 如果事件类型是鼠标按下事件
        if(event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent*>(event);
            if (mouseEvent && mouseEvent->button() == Qt::LeftButton) {
                // 如果按下的是鼠标左键，则开始拖动
                isDragging = true;
                lastPos = mouseEvent->pos(); // 记录鼠标按下位置
                return true; // 表示事件已经处理，不需要进一步传递
            }
        }
        // 如果事件类型是鼠标移动事件
        else if (event->type() == QEvent::MouseMove)
        {

            QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent*>(event);
            if (mouseEvent)
            {
                // 调用拖动函数处理拖动事件
                dragImage(mouseEvent->pos());
                return true; // 表示事件已经处理，不需要进一步传递
            }
        }
        // 如果事件类型是是鼠标释放事件
        else if (event->type() == QEvent::MouseButtonRelease && isDragging)
        {
            // 如果事件类型是鼠标释放事件，并且正在拖动
            isDragging = false; // 结束拖动状态
            return true; // 表示事件已经处理，不需要进一步传递
        }

    }

    // 如果不是鼠标滚轮事件，继续正常处理
    return false;
}

// 放大图片
void MainWindow::on_pushButton1_clicked()
{
	if (zoomout_times > 6) return;

	zoomout_times++;
	zoomin_times--;

	transform.scale(1.25, 1.25);
	image.load(current_pic_path);
	image = image.transformed(transform, Qt::SmoothTransformation);
	ui->label->setPixmap(QPixmap::fromImage(image));
}

// 缩小图片
void MainWindow::on_pushButton2_clicked()
{
	if (zoomin_times > 6) return;
	zoomin_times++;
	zoomout_times--;

	transform.scale(0.8, 0.8);
	image.load(current_pic_path);
	image = image.transformed(transform);
	ui->label->setPixmap(QPixmap::fromImage(image));
}

// 自适应
void MainWindow::on_pushButton4_clicked()
{

	// 调整大小
	QImage img(current_pic_path);
	ui->label->setPixmap(QPixmap::fromImage(img));
}

// 打开文件
void MainWindow::on_action_triggered()
{
	// 临时备份
	QStringList temp = pictures;
	// 清空数据
	pictures.clear();
	pictures = QFileDialog::getOpenFileNames(this,
		"Open File",
		QDir::currentPath(),
		"图片文件 (*.jpg);;图像文件 (*.png)");
	if (pictures.isEmpty())
	{
		// 用户取消，数据恢复
		pictures = temp;
		return;
	}

	temp.clear();  // 删除临时备份数据



	// 获取当前文件路径
	current_pic_path = pictures[index];
	// 显示图片
	show_pic();
}

// 上一张图片
void MainWindow::on_pushButton5_clicked()
{
	index = (index + pictures.size() + 1) % pictures.size();
	current_pic_path = pictures[index];
	show_pic();
}

// 下一张图片
void MainWindow::on_pushButton6_clicked()
{
	index = (index + pictures.size() - 1) % pictures.size();
	current_pic_path = pictures[index];
	show_pic();
}

// 设置图片
void MainWindow::show_pic()
{

    // 判断图片文件类型合法性
    if(!current_pic_path.endsWith(".png") && !current_pic_path.endsWith(".jpg"))
    {
        return;
    }

    // 判断图片文件是否存在
    QFile file(current_pic_path);
    if (!file.exists())
    {
        return;
    }

	int width = ui->label->width();
	int height = ui->label->height();

	image.load(current_pic_path);
	image = image.scaled(width, height, Qt::KeepAspectRatio);
	ui->label->setPixmap(QPixmap::fromImage(image));
}

// 清空函数
void MainWindow::on_pushButton3_clicked()
{

	// 缩小
	while (zoomout_times > 1)
	{
		transform.scale(0.8, 0.8);
		zoomin_times++;
		zoomout_times--;
	}
	image.load(current_pic_path);
	image = image.transformed(transform);

	// 清空组件
	ui->label->clear();
}


